from flask import Flask, request, jsonify, send_file
import os
from werkzeug.utils import secure_filename
from werkzeug.exceptions import BadRequest
import mimetypes
from io import BytesIO

app = Flask(__name__)

# 配置上传文件夹
UPLOAD_FOLDER = '/app/uploads'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['MAX_CONTENT_LENGTH'] = 2048 * 1024 * 1024  # 2G 最大文件大小

# 确保上传目录存在
os.makedirs(UPLOAD_FOLDER, exist_ok=True)

@app.route('/upload', methods=['POST'])
def upload_file():
    """
    上传文件接口
    接收文件和目标路径，保存文件到指定路径，文件名保持不变
    """
    try:
        # 检查是否有文件在请求中
        if 'file' not in request.files:
            return jsonify({'error': '没有文件被上传'}), 400
        
        file = request.files['file']
        target_path = request.form.get('target_path', '')
        
        # 检查文件是否为空
        if file.filename == '':
            return jsonify({'error': '没有选择文件'}), 400
        
        # 检查目标路径是否提供
        if not target_path:
            return jsonify({'error': '目标路径不能为空'}), 400
        
        if file:
            # 保持原始文件名
            filename = secure_filename(file.filename)
            
            # 构建完整的保存路径
            full_target_path = os.path.join(app.config['UPLOAD_FOLDER'], target_path.lstrip('/'))
            
            # 确保目标目录存在
            os.makedirs(os.path.dirname(full_target_path), exist_ok=True)
            
            # 如果target_path是目录，则使用原文件名
            if target_path.endswith('/'):
                full_target_path = os.path.join(full_target_path, filename)
            
            # 保存文件
            file.save(full_target_path)
            
            return jsonify({
                'message': '文件上传成功',
                'filename': filename,
                'saved_path': full_target_path
            }), 200
            
    except Exception as e:
        return jsonify({'error': f'上传失败: {str(e)}'}), 500

@app.route('/download', methods=['GET'])
def download_file():
    """
    下载文件接口
    接收文件路径（包含文件名），读取文件并返回文件内容
    """
    try:
        # 获取文件路径参数
        file_path = request.args.get('file_path')
        
        if not file_path:
            return jsonify({'error': '文件路径不能为空'}), 400
        
        # 构建完整的文件路径
        full_file_path = os.path.join(app.config['UPLOAD_FOLDER'], file_path.lstrip('/'))
        
        # 检查文件是否存在
        if not os.path.exists(full_file_path):
            return jsonify({'error': '文件不存在'}), 404
        
        # 检查是否是文件（不是目录）
        if not os.path.isfile(full_file_path):
            return jsonify({'error': '指定路径不是文件'}), 400
        
        # 获取文件的MIME类型
        mimetype = mimetypes.guess_type(full_file_path)[0]
        if mimetype is None:
            mimetype = 'application/octet-stream'
        
        # 返回文件
        return send_file(
            full_file_path,
            mimetype=mimetype,
            as_attachment=True,
            download_name=os.path.basename(full_file_path)
        )
        
    except Exception as e:
        return jsonify({'error': f'下载失败: {str(e)}'}), 500

@app.route('/file-content', methods=['GET'])
def get_file_content():
    """
    获取文件内容接口（以JSON格式返回文件内容）
    接收文件路径，读取文件内容并以JSON格式返回
    """
    try:
        # 获取文件路径参数
        file_path = request.args.get('file_path')
        
        if not file_path:
            return jsonify({'error': '文件路径不能为空'}), 400
        
        # 构建完整的文件路径
        full_file_path = os.path.join(app.config['UPLOAD_FOLDER'], file_path.lstrip('/'))
        
        # 检查文件是否存在
        if not os.path.exists(full_file_path):
            return jsonify({'error': '文件不存在'}), 404
        
        # 检查是否是文件（不是目录）
        if not os.path.isfile(full_file_path):
            return jsonify({'error': '指定路径不是文件'}), 400
        
        # 读取文件内容
        try:
            with open(full_file_path, 'r', encoding='utf-8') as f:
                content = f.read()
        except UnicodeDecodeError:
            # 如果UTF-8解码失败，尝试二进制读取并转换为base64
            with open(full_file_path, 'rb') as f:
                import base64
                content = base64.b64encode(f.read()).decode('utf-8')
                return jsonify({
                    'filename': os.path.basename(full_file_path),
                    'content': content,
                    'encoding': 'base64',
                    'file_size': os.path.getsize(full_file_path)
                }), 200
        
        return jsonify({
            'filename': os.path.basename(full_file_path),
            'content': content,
            'encoding': 'utf-8',
            'file_size': os.path.getsize(full_file_path)
        }), 200
        
    except Exception as e:
        return jsonify({'error': f'读取文件失败: {str(e)}'}), 500

@app.route('/check', methods=['GET'])
def check_file_exists():
    """
    检查文件是否存在接口
    接收文件路径参数，返回文件是否存在的信息
    """
    try:
        # 获取文件路径参数
        file_path = request.args.get('file_path')
        
        if not file_path:
            return jsonify({'error': '文件路径不能为空'}), 400
        
        # 构建完整的文件路径
        full_file_path = os.path.join(app.config['UPLOAD_FOLDER'], file_path.lstrip('/'))
        
        # 检查文件是否存在
        file_exists = os.path.exists(full_file_path)
        
        # 如果存在，检查是否是文件
        is_file = False
        if file_exists:
            is_file = os.path.isfile(full_file_path)
        
        return jsonify({
            'file_path': file_path,
            'exists': file_exists,
            'is_file': is_file,
            'full_path': full_file_path
        }), 200
        
    except Exception as e:
        return jsonify({'error': f'检查文件失败: {str(e)}'}), 500

@app.route('/health', methods=['GET'])
def health_check():
    """
    健康检查接口
    """
    return jsonify({'status': 'healthy', 'message': '文件服务运行正常'}), 200

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5020, debug=False)